package com.sinven.controller;

import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.sinven.common.ActionResult;
import com.sinven.common.Pager;
import com.sinven.pojo.Classification;
import com.sinven.pojo.Comment;
import com.sinven.pojo.Content;
import com.sinven.pojo.Leave;
import com.sinven.pojo.User;
import com.sinven.serivce.ClassificationSerivce;
import com.sinven.serivce.CommentSerivce;
import com.sinven.serivce.ContentSerivce;
import com.sinven.serivce.LeaveSerivce;
import com.sinven.serivce.UserSerivce;

/**
 * 前台的所有请求
 * @author admin
 *
 */
@Controller
public class IndexController {

	/**
	 * 创建用户Serivce层对象
	 */
	@Autowired
	private UserSerivce userserivce;

	
	/**
	 * 创建内容Serivce层对象
	 */
	@Autowired
	public ContentSerivce contentserivce;
	
	/**
	 * 创建分类Serivce层对象
	 */
	@Autowired
	private ClassificationSerivce serivce;
	

	/**
	 * 创建评论Serivce层对象
	 */
	@Autowired
	public CommentSerivce commentservice;

	
	/**
	 * 创建评论的Serivce层对象
	 */
	@Autowired
	public LeaveSerivce service;
	
	
	/**
	 * 公共方法
	 * @param model
	 * @return
	 */
	public Model gongong(Model model) {
		List<Classification> list = serivce.queryAll();//查询栏目的所有分类
		Random r = new Random();//创建Random对象
		long num = r.nextInt(5) + 1;// 随机产生1~5的数字
		//第一个值是根据随机生成数的栏目id 第二个值是用户的id,因为没有所以设置null
		List<Content> clist = contentserivce.tcreationtimeDescending(num,null);
		//第一个值栏目id,因为让根据发布时间来排序，所以设置null  第二个值是用户的id,因为没有所以设置null
		List<Content> clists = contentserivce.tcreationtimeDescending(null,null);
		//保存在model中
		model.addAttribute("neirong1", clist);
		model.addAttribute("neirong2", clists);
		model.addAttribute("fenlei", list);
		//返回model
		return model;
	}
	
	/**
	 * 留言页面
	 * @param curPage
	 * @param pageSize
	 * @param model
	 * @return
	 */
	@RequestMapping("Leaves")
	public String leave(@RequestParam(value = "curPage", defaultValue = "0") Long curPage,
			@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, Model model) {
		//调用公共方法
		gongong(model);
		//分页查询留言
		Pager<List<Leave>> levaelist = service.queryAll(curPage, pageSize);
		//装入model
		model.addAttribute("leaves", levaelist);
		//返回到页面
		return "front/Leave";
	}

	/**
	 * 添加留言
	 * @param leave
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping("addLeave")
	@ResponseBody
	public Boolean addLeave(Leave leave,HttpServletRequest request,HttpSession session) {
		//先获取session里面的user对象
		User user = (User)session.getAttribute("userz");
		//如果user为null
		if (user == null) {
			//获取用户进入网页的ip地址
			String ip=request.getRemoteAddr();
			//把用户的ip地址传入到实体类的对应数据中
			leave.setiPaddress(ip);
		}else{//否则
			//把登录用户的用户名传入到试题类的对应数据中
			leave.setiPaddress(user.getUserName());
		}
		//返回true 或false
		return service.addLeave(leave);
	}
	
	/**
	 * 当用户点击分类或者更多进入此请求
	 * 
	 * @param model
	 * @param curPage  当前页
	 * @param pageSize 分页显示书
	 * @param cid      分类的cid
	 * @return
	 */
	@GetMapping("main")
	public String select(Model model, @RequestParam(value = "curPage", defaultValue = "1") Long curPage,
			@RequestParam(value = "pageSize", defaultValue = "4") Integer pageSize, Long cid) {
		//根据栏目id来进行分页查询内容 第一个值 每页当前页 第二个值 每页显示数 第三个值 栏目id 第四个值 因为没有用户所以为null
		Pager<List<Content>> pager = contentserivce.queryPaging(curPage, pageSize, cid,null);
		//判断栏目id中的内容是否有置顶
		Boolean queryByroof = contentserivce.queryByroof(cid);
		//装进model中
		model.addAttribute("q", queryByroof);
		model.addAttribute("cid", cid);
		model.addAttribute("pager", pager);
		//调用公共方法
		gongong(model);
		//返回到栏目里的内容页面
		return "front/list";
	}
	
	/**
	 * 跳转关于我
	 * @return
	 */
	@RequestMapping("Aboutme")
	public String Aboutme(Model model) {
		//调用公共方法
		gongong(model);
		//返回到关于我页面
		return "front/Aboutme";
	}
	
	/**
	 * 主页查询6个数据
	 * @param model1
	 * @param content
	 * @return
	 */
	@RequestMapping({"/","index"})
	public String queryClient(Model model1, Content content) {
		//调用公共方法
		gongong(model1);
		//查询每个栏目的根据发布时间顺序的前八条
		List<Content> content1 = contentserivce.tcreationtimeDescending((long) 1,null);
		model1.addAttribute("ContentMain1", content1);
		List<Content> content2 = contentserivce.tcreationtimeDescending((long) 2,null);
		model1.addAttribute("ContentMain2", content2);
		List<Content> content3 = contentserivce.tcreationtimeDescending((long) 3,null);
		model1.addAttribute("ContentMain3", content3);
		List<Content> content4 = contentserivce.tcreationtimeDescending((long) 4,null);
		model1.addAttribute("ContentMain4", content4);
		List<Content> content5 = contentserivce.tcreationtimeDescending((long) 5,null);
		model1.addAttribute("ContentMain5", content5);
		//查询所有栏目的所有置顶文章
		List<Content> content6 = contentserivce.tcreationtimeDescending(null,1);
		model1.addAttribute("ContentMain6", content6);
		//返回到主页面
		return "front/index"; 
	}

	/**
	 * 当到内容的详情页面的请求
	 * 
	 * @param curPage  当前页
	 * @param pageSize 内容显示数
	 * @param tid      内容id
	 * @param model
	 * @return
	 */
	@RequestMapping("info/{tid}")
	public String info(@RequestParam(value = "page", defaultValue = "0") Long curPage,
			@RequestParam(value = "limit", defaultValue = "10") Integer pageSize, 
			@PathVariable("tid") long tid,Model model) {
		//调用公共方法
		gongong(model);
		//根据内容id来查询一条内容的所有信息
		Content content = contentserivce.queryBytid(tid);
		//装入model
		model.addAttribute("content", content);
		//根据内容id来分页查询评论内容
		Pager<List<Comment>> comment = commentservice.queryAll(curPage, pageSize, tid);
		//装入model
		model.addAttribute("comments", comment);
		//返回到内容详情页面
		return "front/info";
	}
	
	/**
	 * 评论的上一页下一页或者点击数字
	 * @param curPage
	 * @param pageSize
	 * @param tid
	 * @param model
	 * @return
	 */
	@RequestMapping("infofenye/{tid}")
	@ResponseBody
	public Pager<List<Comment>> infocomment(@RequestParam(value = "page", defaultValue = "0") Long curPage,
			@RequestParam(value = "limit", defaultValue = "10") Integer pageSize, @PathVariable("tid") long tid,
			Model model) {
		//把查出来的内容保存在Pager内
		Pager<List<Comment>> comment = commentservice.queryAll(curPage, pageSize, tid);
		//返回 数据
		return comment;
	}

	/**
	 * 添加评论
	 * @param comment
	 * @param request
	 * @return
	 */
	@RequestMapping("addcomment")
	@ResponseBody
	public Boolean addcommentz(Comment comment,HttpServletRequest request,HttpSession session) {
		//获取session里面的user对象
		User user = (User)session.getAttribute("userz");
		//如果user为null
		if (user == null) {
			//获取用户进入网页的ip地址
			String ip=request.getRemoteAddr();
			//把用户的ip地址传入到实体类的对应数据中
			comment.setiPaddress(ip);
		}else {//否则
			//把登录用户的用户名传入到试题类的对应数据中
			comment.setiPaddress(user.getUserName());
		}
		//查询内容id的一条内容
		Content content = contentserivce.queryBytid(comment.getContent().getTid());
		//修改评论数加一
		content.setCommentCount(content.getCommentCount()+1);
		//修改内容
		contentserivce.updateContent(content);
		//返回 true false
		return commentservice.addComment(comment);
	}
}
